package test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Cstors {
	public static void main(String[] args) throws ClassNotFoundException {
		Class<?> c3 = Class.forName("java.util.*");
		Constructor<?>[] cst1 = c3.getConstructors();
	}
	/**构造器不会的内容：
	反射得到类的描述的三种方式
	使用构造器如何得到类的描述
	如何利用反射，实例化出对象
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * @throws ClassNotFoundException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException */
	public void test1() throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//使用自动向上转型的方式定义新的对象
		Class<?> c3 = Class.forName("java.lang.Long");
		Constructor<?> cs1 = c3.getConstructor(int.class);
		Object object = cs1.newInstance(11);	//其中的参数要根据该类中的构造方法有几种参数类型决定
		//还可以根据这个类的描述得到其中的方法
		Method[] mt1 = c3.getMethods();//得到公有的方法
		Method[] mt2 = c3.getDeclaredMethods();//得到所有的方法(除构造方法)
		//反射的强大之处：强制访问私有方法
		Method md1 = c3.getMethod("exe",String.class,int.class);
		md1.setAccessible(true);//取消访问限制,把private设置为可以访问
		//普通调用方法
		md1.invoke(c3.newInstance(),"aa",11);//调用
		//静态调用方法
		md1.invoke("null","aa",11);
		//获得变量
	}
		
		public void test4() throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchFieldException, SecurityException{
			Class<?> c3 = Class.forName("类全名");
			Field[] fds = c3.getFields();//一个类中所定义出来的字段
			//其他用法，触类旁通，得到一个或者所有字段
			//Declared可以得到私有，如果要得到一个，给形参赋值
			c3.getDeclaredFields();
			c3.getDeclaredField("");
			c3.getField("");
			//举例：先看正向的非映射赋值方法
			TestB t1 = new TestB();
			int k = t1.a;
			t1.a=100;
			Field fd1 = null;
			//再看反向的映射赋值方法
			Object val = fd1.get(c3.newInstance());
		}
		static void exe(String a, int b){
			System.out.println(a);
			System.out.println(b);
		}
		//重点总结：
		//1. 如何得到类的描述
		//2. 类的描述/构造器，两种方法创建对象
		//3. 取消访问限制
		//4. 了解哪个方法再定义和使用的时候需要什么参数，不定参数的规则
		//5. 类中的成员变量如何反射，得到一个或多个，私有还是公有
}
